ECS Fargate でタスク終了時のフローを教えてください
困っていた内容
ECS Fargate (Linux)でアプリケーションを実行する予定です。
デプロイなどでタスクを終了する場合、アプリケーションの処理が終わるまで待機しますか?それとも処理状況に関係なく強制終了しますか。
ECS Fargate のタスク終了がどのようなフローになるか教えてください。
どうなるの?
まず SIGTERM が送信され、指定時間後も終了していない場合は強制終了(SIGKILL)されます。
ECS タスクが停止すると、コンテナ内のプロセス(PID 1)に SIGTERM シグナル(終了要求)が送信されます。その後、設定されたタイムアウト時間(stopTimeout
)が経過するまで待機し、経過後も終了していない場合は SIGKILL シグナル(強制終了)が送信されます。
そのため、コンテナ内のアプリケーションは SIGTERM シグナルをハンドリングし、シャットダウンしないと、意図しないエラーやデータ損失に繋がる可能性があります。
なお、シグナルは AWS 独自の仕組みではないため、終了処理を実装する際はプログラミング言語に Graceful Shutdown のキーワードを追加して検索するとサンプル等が得られる場合があります。
また、ECS Fargate の場合、タイムアウト時間は ECS タスク定義のstopTimeout
で設定でき、デフォルトは 30 秒、設定できる最大値は 120 秒です。
アプリケーションの処理内容や終了時の実装に応じて、タイムアウト時間を調整してください。
Amazon ECS タスク定義パラメータ - Amazon Elastic Container Service
stopTimeout
(中略)
コンテナが正常に終了しなかった場合にコンテナが強制終了されるまでの待機時間 (秒)。Fargate でホストされている Amazon ECS タスクの場合、このパラメータのために、タスクまたはサービスがプラットフォームバージョン 1.3.0 以降 (Linux) を使用している必要があります。このパラメータを指定しない場合には、デフォルト値の 30 秒が適用されます。Fargate の最大値は 120 秒です。
ECS サービスにロードバランサーを設定している場合
ECS サービスでロードバランサー(ELB)を設定している場合は、SIGTERM シグナルが送信される前に、ターゲットグループから登録解除が行われます。
登録解除の待機時間はターゲットグループのderegistration_delay.timeout_seconds
で設定します。
deregistration_delay.timeout_seconds
は比較的長い時間を設定できますが、Fargate Spot を使用する場合は注意が必要です。
Fargate Spot の場合、キャパシティが回収されるまでの猶予は 120 秒です。
終了時のフローは同様となりますが、ターゲットグループからの登録解除時間を含めるため、deregistration_delay.timeout_seconds
とstopTimeout
の合計が 120秒を超える場合、意図しないタイミングでコンテナが終了する場合があります。
Fargate Spot で ELB を使用する構成の場合は、タイムアウト時間を決める際にご注意ください。
参考資料
タスクが停止すると、各コンテナのエントリプロセス (通常は PID 1) に SIGTERM シグナルを送信します。タイムアウトが経過すると、今度は SIGKILL シグナルをプロセスに送信します。デフォルトでは、SIGTERM シグナルの送信後 30 秒のタイムアウトで SIGKILL シグナルを送信します。
Linux コンテナの場合、コンテナエージェントは、アプリケーションを終了してシャットダウンする必要があることを通知する SIGTERM シグナルを送信し、タスク定義で設定された StopTimeout 期間を待機した後に SIGKILL を送信します。
Amazon ECS のロードバランシングでは、タスクが停止状態に入る前に ELB から登録解除されるため、トラフィックをより正確に実行中のタスクにルーティングできるようになりました。
- Fargate Spot タスクでスポット終了通知を処理する | AWS re:Post
- Application Load Balancer のターゲットグループ - Elastic Load Balancing
deregistration_delay.timeout_seconds
ターゲットを登録解除する前に Elastic Load Balancing が待機する時間。範囲は 0 ~ 3600 秒です。デフォルト値は 300 秒です。